YAML && JSON && AWS CloudFormation

YAML nedir JSON nedir şimdi ne alaka yanına bir AWS servisi diyebilirsiniz. Neden öğreniyoruz aralarındaki bağlantı nedir hepsini anlatacağım. YAML ve JSON bir programlama dili değildir. Bunlar farklı syntax'lere sahip bir dosya formatıdır. Peki biz neden bilmek zorundayız YAML ve JSON'u. CloudFormation servisinin çalışması için template dosya hazırlamamız gerekiyor ve bu dosyanın formayı YAML ve JSON olması gererkiyor. Peki bu dosya ne işe yarıyor? Kabaca ifade edeyim siz bu dosyanın içine bişeyler yazıyorsunuz ve yazdığınız bilgilere göre makina ayağa kaldırıyorsunuz veya database oluşturuyorsunuz gibi birçok şey yapabiliyorsunuz. Şöyle diyebiliriz siz kağıt üstünde mimariyi oluşturuyorsunuz aws cloudformation servisine veriyorsunuz o sizin girdilerinize uygun ortamı hazırlıyor.

Neden öğrendiğimizin farkına vardıktan sonra şimdi YAML'dan başlayalım. Aslında sadece AWS için de değil DEVOPS tool'larında da bu formatı kullanıyor olacağız. YAML için kofigurasyon oluşturma formatı diyebiliriz.

YAML case sensitive'dir. Yani büyük küçük harf duyarlıdır. Uzantısı .yaml veya .yml olabilir. Key-Value çifti temel yapısıdır. Key ler her zaman string olmak zorundadır, value ler herhangi tipte olabilir.

Liste tanımlaması yaparken her item'dan önce (- ve boşluk) kullanılmalıdır. Ayrıca liste tanımlamasını [ , , ] şeklinde deyapabilirsiniz.

Key Value arasına ":" işareti konulur.

Araba:
    -   marka: BMW
        model: 2012
    -   marka: Audi
        model: 2020

Dictionary yapısını da çeşitli şekilllerde kurabilirsiniz. 3 farklı yöntemi aşağıda belirteceğim.

friends:
    -   name: yaşar
        age: 20
    -   {name: beşir, age: 25}
	  -   
				name: "sakıp"
				age:23
        

"#" işareti yorum satırı için kullanılır.

Liste içindeki itemları yazarke "," ve boşluk kullanılır.

--- # Course List
   [Aws/DevOps,  Web Developer, QA Tester]

Girinti kullanmak için tab'den ziyade boşluk kullanılır.

Bölümler ayırmak için 3 tire( --- ) kullanılır

Ayrıca yaml dosyası 3 tire( --- ) ile başlar 3 nokta(...) ile biter. Zorunlu değildir bu uygulama.

---
# A list of courses
- AWS
- DevOps
- Web Developer
...

indentation yani girintiler önemlidir. Burada önemli olan husus şu boşluk olmalı ama ne kadar olduğu önemsizdir. eğer alt satıra yazılan ifade üsttekinin value sü ise en az bir boşluk olmalı, eğer onunda value'sü varsa bu sefer 2 boşluk bırakabilrsiniz. önemli onal parent child ilişkisi gibi düşünürseniz chil parent arasında en az bir boşluk olmalı. Aşağıdaki örnek gibi.

a:
   b:
      - c
      -  d
      - e
f:
      "ghi"

Yukardaki yapı aslında YAML'ın Block tipidir. İlla bu şekilde yazmak zorunda değilsiniz. Aşağıdaki gibi JSON şeklinde de yazılabilir. Ama yukarıdaki tip daha anlaşılırdır.

John MC {hr: 65, avg: 0.278}
James Oliver: {
    hr: 63,
    avg: 0.288
  }

( | ) işaretinden sonra gelen her satır ayrı değerlendirilir.

( > ) işaretinden sonra gelen tüm satırlar tek satır gibi değerlendirilir. Uzun text leri okunabilir olsun diye kullanılabilir.

data: |
   Her
   satır
   degerlendirilir

data: >
   tüm
   satır
   tek bir
   satır gibidir.

Çift tırnak ( " " ) veya tek tırnak( ' ' ) kullanılabilir.

Sayılar integer, octal, hexadecimal, float veya infinity(.inf) olabilir.

tarih formatı 2020-03-15 şeklindedir.

(!!) işareti format değiştirmek için kullanılır.

age: !!float 23 # 23.0 olur



Sıra geldi JSON'a. JSON özellikle verilerin transferinde kullanılan bir formattır. Çok az yer kaplar, Konfigurasyon dosyalarında ve API'lerde kullanılır. Örneğin siz form doldurdunuz ve gönderdiniz bilgiler JSON'a döüştürülüp bir yerden diğer yere iletilir. YAML'a bnezerdir ama onun kadar esnek değildir.

Veriler key: value çifti olarak tutulur. Datalar (,) ile ayrılır. { } veya [ ] verileri oluşturmak için her ikisi de kullanılabilir.

{
"employees":[ "John", "Aaron", "James" , "Oliver" , "Walter" ]
}

Function ve date kullanılamaz. Sayı olarak sadece number kullanılabilir.

Stringlerde (" ") kullanmak zorunludur. YAML da kullanbiliyorduk.

Yorum satırı girilemez. Dikkat edelim eğer yaml dosyasını json a dönüştürmek istersek ve json desteklemediği bir husus olursa hata alırız.



YAML ve JSON hakkında temel bilgiyi aldıktan sonra bunu kullanacağımız AWS sevisi CloudFormation'a geçebiliriz. Öncelikle bu servisi kullanmak ücretsiz hazırladığınız template sonrası çalışan kaynakların ücreti olacaktır. Peki neden bu servise ihtiyacımız var? Biz arayüz kullanarak instance ayağa kaldırabiliyoruz. Ancak birden fazla ilişkili servisin birden fazla kaynağını kullanacak bir senaryoya ihitacınız varsa ve bu formatı başka müşterilerde de kullanacaksanız mimarisini önceden hazırlarsanız her seferin de tek tek uğraşmadan tek adımda oluştuabilirsiniz.

Cloudformation infrastructer as a code tool udur. Bunun karşılığı diğer sistemlerde de kullanılan Terraform tool udur. Bu servis sadece AWS özelinde kullanılabilir.

yaml veya json olarak template hazırlanır. Template hazırlamak için vscode programını kullanabilirsiniz. Aşağıdaki extention ları kurmanız yaml dosyası hazırlarken işinizi kolaylaştıracaktır.

Name: YAML

Id: redhat.vscode-yaml

Name: YAML JSON

Id: hilleer.yaml-plus-json

Name: CloudFormation Linter

Id: kddejong.vscode-cfn-lint

Name: CloudFormation Snippets

Id: dsteenman.cloudformation-yaml-snippets



Template hazırlamaya başlıyoruz. Basit bir uygulama yapacağız bir instance ayağa kaldıracak dosyayı hazırlayacağız.

ilk satıra cfn yazdığınızda Cloudformation görülecek tıkladığınızda aşağıdaki formatı göreceksiniz.

AWSTemplateFormatVersion: 2010-09-09
Description: |
  
Parameters:
  
Metadata:
  
Mappings:
  
Conditions:
  
Resources:
  
Transform:
  
Outputs:

Gördüğünüz gibi YAML formatı. ( bölümden Resources hariç diğer 7 si optionaldır zorunlu değildir.

Resourse kısmına ec2-instance yazıldığında;

Type: AWS::EC2::Instance
  Properties:
    AdditionalInfo: "String"
    Affinity: "String"
    AvailabilityZone: "String"
    BlockDeviceMappings:
      BlockDeviceMappings
    CpuOptions:
      CoreCount: Number
      ThreadsPerCore: Number
    CreditSpecification:
      CPUCredits: "Number"
    DisableApiTermination: false
    EbsOptimized: false
    ElasticGpuSpecifications:
      ElasticGpuSpecifications
    ElasticInferenceAccelerators:
      ElasticInferenceAccelerators
    EnclaveOptions:
      Enabled: false
    HibernationOptions:
      Configured: false
    HostId: "String"
    HostResourceGroupArn: "String"
    IamInstanceProfile: "String"
    ImageId: "String"
    InstanceInitiatedShutdownBehavior: "String"
    InstanceType: "String"
    Ipv6AddressCount: Number
    Ipv6Addresses:
      Ipv6Addresses
    KernelId: "String"
    KeyName: "String"
    LaunchTemplate:
      LaunchTemplateId: "String"
      LaunchTemplateName: "String"
      Version: "String"
    LicenseSpecifications:
      LicenseSpecifications
    Monitoring: String
    NetworkInterfaces:
      NetworkInterfaces
    PlacementGroupName: "String"
    PrivateIpAddress: "String"
    RamdiskId: "String"
    SecurityGroupIds:
      SecurityGroupIds
    SecurityGroups:
      SecurityGroups
    SourceDestCheck: false
    SsmAssociations:
      SsmAssociations
    SubnetId: "String"
    Tags:
      Tags
    Tenancy: "String"
    UserData: "String"
    Volumes:
      Volumes

Görüldüğü gibi uzun bir format geldi. Bu alanlardan hepsini doldurmak zorunda değilsiniz ihtiyacınız olan alalar haricindeki diğer alanları silerseniz default değerler atanacaktır.

logical_id kısmına istediğiniz ismi verebilirsiniz.

imageid kısmına seçmek istediğiniz image id yi girmeniz gerekiyor. Ben Amazon Ami seçtim.

instanceType olarak t2.micro giriyorum

security grup kısmına daha önce hazırladığınız uygun birinin ismini yazabilirsiniz. Ancak burada önemli bir husus var tiplerini doğru girmeliyiz. sg formatı dokümanında list of string olduğu için alt satıra geçip - işareti ile değeri girmeliyiz. İncelemek için Dokümantasyon linkini bırakıyorum.

SecurityGroups:
      - launch-wizard-3

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-securitygroups

tags kısmı da list of string ve key value kullanamak gerekir.

Tags:
      - Key: Name
        Value: CFNicin
      - Key: Department
        Value: ik

key için pem uzantılı dosyanın adını giriyoruz .pem yazılamayacak.

AWSTemplateFormatVersion: 2010-09-09
Resources:
  sametcfn:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-02e136e904f3da870
      InstanceType: t2.micro
      KeyName: key
      SecurityGroups:
        - launch-wizard-3
      Tags:
        - Key: Name
          Value: CFNicin
        - Key: Department
          Value: ik

Basitçe yukarıdaki gibi gerekli olanları hazırladık yml olarak kaydediyoruz. Birazdan kullanacağız. Uzantı farklı olsada template içi yaml veya json formatında olmalı. CloudFormation servisine gidip "create stack" kısmına gidelim. Karşımıza aşağıdaki gibi bir sayfa çıkacak.

3 seçenek var biz template hazırladığımız için birincisini kullanacağız. İkincisi hazır templatelerden seçim üçüncüsü ise arayüzü olan bir designer ile yapılan tip.

s3 depodan veya localinizden yükleyeceksiniz. Localden yüklediğinizde otomatik s3 e atacak. Next diyoruz.

Stack'e bir isim girelim ve next diyelim. Dilerseniz tag girebilirsiniz. Diğer kısımları default bırakıp create stack ile stack yaratılıyor. Event kısmını takip edelim. Bir süre sonra hazır olacak ve "CREATE_COMPLETE" gördüğünüzde artık hazır olmuş olacak. ec2 sayfasına gidip ec2 muzun ayağa kalktığını görebiliriz 🙂

Yarattığınız stack'i silmeyi unutmayın ec2 free tier hakkınız yoksa para yazacak 😂

𝒟𝒜𝐻𝒜 Ö𝒵𝒢Ü𝑅 𝐵İ𝑅 𝒟Ü𝒩𝒴𝒜’𝒟𝒜 𝒢Ö𝑅ÜŞ𝑀𝐸𝒦 Ü𝒵𝐸𝑅𝐸

𝒮𝒜Ğ𝐿𝐼𝒞𝒜𝒦𝐿𝒜 𝒦𝒜𝐿𝐼𝒩